#ifndef __AMP_M4__
#define __AMP_M4__
#include <stdio.h>
#include <string.h>
#include "ipcc.h"
#include "openamp.h"
#include "FreeRTOS.h"
#include "queue.h"
#include "semphr.h"
#include "cmsis_os2.h"
#include "virt_uart.h"

#ifdef __cplusplus
extern "C"
{
#endif

#define ERROR_PARAMS_FAIIL 					-1
#define ERROR_QUEUE_CREATE_FAIIL 			-2
#define ERROR_MUTEX_CREATE_FAIIL 			-3
#define MAX_BUFFER_SIZE 					RPMSG_BUFFER_SIZE

typedef enum {
	// 通知模式
	CMD_INFORM = 0,
	// 请求模式
	CMD_REQ,
	// 回复模式
	CMD_ANS,
	// 应答模式
	//	REMOTE_MODE,

} cmd_mode_te;

typedef enum {
	// 初始模式
	SYS_INIT = 0,
	// 发送模式模式
	SEND_MODE,
	// 重复模式
	RESEND_MODE,
	// 应答模式
	//	ACK_MODE,
} sys_mode_te;

/**
 * @brief 核间消息发送数据结构
 */
typedef struct
{
	uint8_t cmd_fun;	/* 命令字 */
	uint8_t num;		/* 序号 */
	uint8_t index;		/* 数据索引 */
	uint8_t data[32];	/* 数据段 */
} amp_send_msg_t;

extern VIRT_UART_HandleTypeDef huart0;
void VIRT_UART0_RxCpltCallback(VIRT_UART_HandleTypeDef *huart);
extern uint8_t Copy_Buffer[MAX_BUFFER_SIZE];
extern uint8_t BuffTx[MAX_BUFFER_SIZE];
extern uint16_t RxSize;
extern __IO FlagStatus flag;
extern __IO FlagStatus flagsend;

extern QueueHandle_t send_q;

extern cmd_mode_te cmdworkmode;
extern sys_mode_te sysworkmode;
extern uint8_t databuff[50], messagedata[50];
extern uint8_t ACK, ACKFLAG, Ttickack;
void receivmesg(void);
void sendmesg(void);
int Viri_send(uint8_t cmd, uint8_t index);

#ifdef __cplusplus
}
#endif
#endif /* __AMP_M4__ */
